﻿using BLL;
using Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace Student
{
    public partial class Group_setting : Form
    {
        BLL.B_Group bllGroup = new BLL.B_Group();
        BLL.B_Student b_Student = new BLL.B_Student();
        List<Models.Student> all_stu_wo_group;
        List<Models.Student> group_members;
        Stu_group stu_Group;

        public Group_setting()//构造函数，用于初始化窗体。
        {
            InitializeComponent();
        }

        private void join_Group_Click(object sender, EventArgs e)//当用户点击“加入分组”按钮时触发的事件处理程序。它检查用户是否超时、是否为组长，并尝试将选中的学生添加到分组中。
        {
            if (log_info.Student_timeout)
            {
                MessageBox.Show("已经超时，不能再修改！");
                return;
            }

            if (string.IsNullOrEmpty(Group_name.Text))
            {
                MessageBox.Show("操作之前请队长先输入队伍信息，提交队伍进行建队！");
                return;
            }

            if (log_info.student.is_gleader==-1)
            {
                MessageBox.Show("只有组长才能选择组员！");
                return;
            }

            // 创建一个新的列表来存储要添加到分组中的学生对象。
            List<Models.Student> group_stu = new List<Models.Student>();
            foreach (DataGridViewRow dr in Student_list.SelectedRows)// 遍历在“未分组学生”列表（Student_list）中选中的所有行。
            {
                // 将选中的学生添加到group_stu列表中。all_stu_wo_group是包含所有未分组学生对象的列表。
                group_stu.Add(all_stu_wo_group[dr.Index]);
            }
        //   if(stu_Group.members != null)
        //   {
        //       if (group_stu.Count + stu_Group.members > log_info.Sys_Config.group_members)    // 检查要添加的学生数量加上当前分组中的成员数量是否超过了系统配置中定义的每个分组的最大成员数。如果超过，则显示消息框提示，并退出方法。
        //       {
        //           MessageBox.Show("队伍人数超上限！");
        //           return;
        //       }
        //   }
            if (group_stu.Count + stu_Group.members > log_info.Sys_Config.group_members)    // 检查要添加的学生数量加上当前分组中的成员数量是否超过了系统配置中定义的每个分组的最大成员数。如果超过，则显示消息框提示，并退出方法。
            {
                MessageBox.Show("队伍人数超上限！");
                return;
            }
            try
            {
                if (!bllGroup.Add_student(group_stu, stu_Group))//添加学生的函数
                {
                    MessageBox.Show("添加失败！");
                    return;
                }
                group_members = b_Student.GetList(stu_Group);
                Group_members.DataSource = group_members;
                all_stu_wo_group = b_Student.GetList_wo_Group();
                Student_list.DataSource = all_stu_wo_group;
            }
            catch (Tools.AddException ex)
            {
                MessageBox.Show(ex.ToString());
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }

        }

        private void commit_Group_Click(object sender, EventArgs e)//提交队伍的函数
        {
            //if(log_info.Student_timeout)
            //{
            //    MessageBox.Show("已经超时，不能再修改！");
            //    return;
            //}

            //if (stu_Group == null)
            //{
            //    stu_Group = new Models.Stu_group();
            //}

            //if (string.IsNullOrEmpty(Group_name.Text))
            //{
            //    MessageBox.Show("队伍名称不能为空");
            //    return;
            //}

            //stu_Group.group_name = Group_name.Text;
            //stu_Group.project_name = Project_name.Text;
            //stu_Group.project_info = Group_info.Text;

            //BLL.B_Group b_Group = new BLL.B_Group();
            //try
            //{
            //    //Models.Student student = Tools.Clone.CloneObject(Models.log_info.student);

            //    if (b_Group.Commit(stu_Group, Models.log_info.student))
            //    {
            //        MessageBox.Show("ok!");
            //        //log_info.student = student;

            //       // b_Student.ResetOtherStudentsLeadership(stu_Group.group_id, Models.log_info.student.stu_id);
                    

            //    }
            //    else
            //        MessageBox.Show("更新失败，请确定是否为队长或者数据库问题？");

            //    // 重新获取未分组的学生列表，并更新“未分组学生”列表的数据源。
            //    all_stu_wo_group = b_Student.GetList_wo_Group();
            //    Student_list.DataSource = all_stu_wo_group;


            //    // 重新获取组成员列表，并更新“组成员”列表的数据源为BindingList类型，这样可以提供更好的数据绑定功能。
            //    group_members = b_Student.GetList(stu_Group);
            //    Group_members.DataSource = new BindingList<Models.Student>(group_members);
            //}
            //catch (Tools.Modify_Exception ex)
            //{
            //    MessageBox.Show(ex.ToString());
            //}
            //catch(Exception ex)
            //{
            //    MessageBox.Show(ex.ToString());
            //}
        }

        private void Group_Load(object sender, EventArgs e)//这段代码是 Group_setting 窗体的 Group_Load 事件处理程序，它在窗体加载时被触发。这个方法的主要目的是初始化窗体上的数据，包括未分组的学生列表和当前分组的详细信息。
        {
            try
            {
                all_stu_wo_group = b_Student.GetList_wo_Group();//获取未分组的学生
                Student_list.DataSource = all_stu_wo_group;//这行代码将 Student_list DataGridView控件的数据源设置为 all_stu_wo_group，这样控件就会显示所有未分组的学生。

                //Student_list.Columns["stu_id"].Visible = false;
                Student_list.Columns["pwd"].Visible = false;
                Student_list.Columns["major_id"].Visible = false;
                Student_list.Columns["group_id"].Visible = false;
                Student_list.Columns["is_gleader"].Visible = false;

                Student_list.Columns["stu_id"].HeaderText = "学生ID";
                Student_list.Columns["stu_no"].HeaderText = "学号";
                Student_list.Columns["stu_name"].HeaderText = "姓名";
                Student_list.Columns["grade"].HeaderText = "年级";
                Student_list.Columns["phone"].HeaderText = "电话";

                stu_Group = bllGroup.GetGroup(log_info.student);//这行代码调用 B_Group 类的 GetGroup 方法来获取当前登录学生所在的分组信息，并将其存储在 stu_Group 变量中。log_info.student 是一个全局变量，存储了当前登录的学生信息。
                if (stu_Group != null)
                {
                    Group_name.Text = stu_Group.group_name;
                    Project_name.Text = stu_Group.project_name;
                    Group_info.Text = stu_Group.project_info;

                    group_members = b_Student.GetList(stu_Group);//调用 B_Student 类的 GetList 方法来获取当前分组的所有成员，并将其存储在 group_members 变量中。
                    Group_members.DataSource = new BindingList<Models.Student>(group_members);//DataGridView控件的数据源设置为 group_members，这样控件就会显示当前分组的所有成员。这里使用 BindingList 而不是直接使用列表，是为了能够动态地更新数据源。

                    Group_members.Columns["pwd"].Visible = false;
                    Group_members.Columns["major_id"].Visible = false;

                    Group_members.Columns["stu_id"].HeaderText = "学生ID";
                    Group_members.Columns["stu_no"].HeaderText = "学号";
                    Group_members.Columns["stu_name"].HeaderText = "姓名";
                    Group_members.Columns["grade"].HeaderText = "年级";
                    Group_members.Columns["phone"].HeaderText = "电话";
                    Group_members.Columns["group_id"].HeaderText = "学生组ID";
                    Group_members.Columns["is_gleader"].HeaderText = "是否为组长";
                }
            }
            catch
            {
                MessageBox.Show("数据库发生错误");
            }
        }

        private void release_Click(object sender, EventArgs e)//解散队伍函数
        {
            if (log_info.Student_timeout)
            {
                MessageBox.Show("已经超时，不能再修改！");
                return;
            }

            if (string.IsNullOrEmpty(Group_name.Text))
            {
                MessageBox.Show("操作之前请队长先输入队伍信息，提交队伍进行建队！");
                return;
            }


            if (log_info.student.is_gleader == -1)
            {
                MessageBox.Show("组长才能解散队伍！");
                return;
            }

            //b_Student.ResetOtherStudentsLeadership2(stu_Group.group_id, Models.log_info.student.stu_id);


            try
            {
                BLL.B_Group b_Group = new BLL.B_Group();
                b_Group.release(stu_Group);


                clear_control();
                Group_members.DataSource = null;
                all_stu_wo_group = b_Student.GetList_wo_Group();
                Student_list.DataSource = all_stu_wo_group;
            }
            catch (Tools.Modify_Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }

        }


        private void clear_control()
        {
            Group_name.Text = "";
            Project_name.Text = "";
            Group_info.Text = "";
            
            log_info.stu_Group = null;

        }

        private void Remove_stu_Click(object sender, EventArgs e)
        {
            if (log_info.Student_timeout)
            {
                MessageBox.Show("已经超时，不能再修改！");
                return;
            }

            if (string.IsNullOrEmpty(Group_name.Text))
            {
                MessageBox.Show("操作之前请队长先输入队伍信息，提交队伍进行建队！");
                return;
            }

            if (log_info.student.is_gleader == -1)
            {
                MessageBox.Show("组长才能编辑组员！");
                return;
            }
            
            List<Models.Student> Removed_stu = new List<Models.Student>();
            Models.Student stu;

            foreach (DataGridViewRow dr in Group_members.SelectedRows) // 遍历在“组成员”DataGridView控件中选中的所有行
            {
                stu = group_members[dr.Index]; // 获取当前行对应的学生对象。
                if (stu.stu_id == log_info.student.stu_id) // 如果当前学生是操作的学生本人，则停止循环（不允许移除自己）。
                { break; }
                Removed_stu.Add(stu);
            }
            try
            {
                if (!bllGroup.Remove_student(Removed_stu, stu_Group))// 调用业务逻辑层的bllGroup.Remove_student方法，尝试将Removed_stu列表中的学生从stu_Group分组中移除。如果移除失败，则显示消息框提示，并退出方法。
                {
                    MessageBox.Show("删除失败！");
                    return;
                }
                group_members = b_Student.GetList(stu_Group);
                Group_members.DataSource = group_members;
                all_stu_wo_group = b_Student.GetList_wo_Group();
                Student_list.DataSource = all_stu_wo_group;
            }
            catch (Tools.Del_Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }

        }

        //private void button1_Click(object sender, EventArgs e)
        //{
        //    all_stu_wo_group = b_Student.GetList_wo_Group();
        //    Student_list.DataSource = all_stu_wo_group;
        //    string searchText = textBox1.Text.Trim(); // 获取文本框中的搜索文本，并去除前后空格
        //    if (all_stu_wo_group == null)
        //    {
        //        return;
        //    }
        //    if (searchText == "")
        //    {
        //        // 如果文本框为空，显示所有学生
        //        Student_list.DataSource = all_stu_wo_group;
        //    }
        //    else
        //    {
        //        var filteredPeople = all_stu_wo_group
        //    .Where(stu => stu.stu_name.IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0)
        //    .ToList();
        //        if (filteredPeople.Count > 0)
        //        {
        //            // 如果搜索结果不为空，显示搜索结果
        //            Student_list.DataSource = filteredPeople;
        //            all_stu_wo_group = filteredPeople; // 更新all_stu_wo_group为搜索结果
        //        }
        //        else
        //        {
        //            // 如果搜索结果为空，保持显示所有学生
        //            Student_list.DataSource = all_stu_wo_group;
        //            MessageBox.Show("找不到该未组队学生");
        //        }
        //    }
        //}

        private void Student_list_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void Group_members_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void label3_Click(object sender, EventArgs e)
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void uiButton1_Click(object sender, EventArgs e)
        {
            if (log_info.Student_timeout)
            {
                MessageBox.Show("已经超时，不能再修改！");
                return;
            }

            if (stu_Group == null)
            {
                stu_Group = new Models.Stu_group();
            }

            if (string.IsNullOrEmpty(Group_name.Text))
            {
                MessageBox.Show("队伍名称不能为空");
                return;
            }

            stu_Group.group_name = Group_name.Text;
            stu_Group.project_name = Project_name.Text;
            stu_Group.project_info = Group_info.Text;

            BLL.B_Group b_Group = new BLL.B_Group();
            try
            {
                //Models.Student student = Tools.Clone.CloneObject(Models.log_info.student);

                if (b_Group.Commit(stu_Group, Models.log_info.student))
                {
                    MessageBox.Show("ok!");
                    //log_info.student = student;

                    // b_Student.ResetOtherStudentsLeadership(stu_Group.group_id, Models.log_info.student.stu_id);


                }
                else
                    MessageBox.Show("更新失败，请确定是否为队长或者数据库问题？");

                // 重新获取未分组的学生列表，并更新“未分组学生”列表的数据源。
                all_stu_wo_group = b_Student.GetList_wo_Group();
                Student_list.DataSource = all_stu_wo_group;


                // 重新获取组成员列表，并更新“组成员”列表的数据源为BindingList类型，这样可以提供更好的数据绑定功能。
                group_members = b_Student.GetList(stu_Group);
                Group_members.DataSource = new BindingList<Models.Student>(group_members);
            }
            catch (Tools.Modify_Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        private void uiTextBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void uiButton_search1_Click(object sender, EventArgs e)
        {
            all_stu_wo_group = b_Student.GetList_wo_Group();
            Student_list.DataSource = all_stu_wo_group;
            string searchText = textBox1.Text.Trim(); // 获取文本框中的搜索文本，并去除前后空格
            if (all_stu_wo_group == null)
            {
                return;
            }
            if (searchText == "")
            {
                // 如果文本框为空，显示所有学生
                Student_list.DataSource = all_stu_wo_group;
            }
            else
            {
                var filteredPeople = all_stu_wo_group
            .Where(stu => stu.stu_name.IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0)
            .ToList();
                if (filteredPeople.Count > 0)
                {
                    // 如果搜索结果不为空，显示搜索结果
                    Student_list.DataSource = filteredPeople;
                    all_stu_wo_group = filteredPeople; // 更新all_stu_wo_group为搜索结果
                }
                else
                {
                    // 如果搜索结果为空，保持显示所有学生
                    Student_list.DataSource = all_stu_wo_group;
                    MessageBox.Show("找不到该未组队学生");
                }
            }
        }

        private void label2_Click(object sender, EventArgs e)
        {

        }

        private void uiButton3_Click(object sender, EventArgs e)
        {
            if (log_info.Student_timeout)
            {
                MessageBox.Show("已经超时，不能再修改！");
                return;
            }

            if (string.IsNullOrEmpty(Group_name.Text))
            {
                MessageBox.Show("操作之前请队长先输入队伍信息，提交队伍进行建队！");
                return;
            }

            if (log_info.student.is_gleader == -1)
            {
                MessageBox.Show("只有组长才能选择组员！");
                return;
            }

            // 创建一个新的列表来存储要添加到分组中的学生对象。
            List<Models.Student> group_stu = new List<Models.Student>();
            foreach (DataGridViewRow dr in Student_list.SelectedRows)// 遍历在“未分组学生”列表（Student_list）中选中的所有行。
            {
                // 将选中的学生添加到group_stu列表中。all_stu_wo_group是包含所有未分组学生对象的列表。
                group_stu.Add(all_stu_wo_group[dr.Index]);
            }
            //   if(stu_Group.members != null)
            //   {
            //       if (group_stu.Count + stu_Group.members > log_info.Sys_Config.group_members)    // 检查要添加的学生数量加上当前分组中的成员数量是否超过了系统配置中定义的每个分组的最大成员数。如果超过，则显示消息框提示，并退出方法。
            //       {
            //           MessageBox.Show("队伍人数超上限！");
            //           return;
            //       }
            //   }
            if (group_stu.Count + stu_Group.members > log_info.Sys_Config.group_members)    // 检查要添加的学生数量加上当前分组中的成员数量是否超过了系统配置中定义的每个分组的最大成员数。如果超过，则显示消息框提示，并退出方法。
            {
                MessageBox.Show("队伍人数超上限！");
                return;
            }
            try
            {
                if (!bllGroup.Add_student(group_stu, stu_Group))//添加学生的函数
                {
                    MessageBox.Show("添加失败！");
                    return;
                }
                group_members = b_Student.GetList(stu_Group);
                Group_members.DataSource = group_members;
                all_stu_wo_group = b_Student.GetList_wo_Group();
                Student_list.DataSource = all_stu_wo_group;
            }
            catch (Tools.AddException ex)
            {
                MessageBox.Show(ex.ToString());
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        private void uiButton_delgm2_Click(object sender, EventArgs e)
        {
            if (log_info.Student_timeout)
            {
                MessageBox.Show("已经超时，不能再修改！");
                return;
            }

            if (string.IsNullOrEmpty(Group_name.Text))
            {
                MessageBox.Show("操作之前请队长先输入队伍信息，提交队伍进行建队！");
                return;
            }

            if (log_info.student.is_gleader == -1)
            {
                MessageBox.Show("组长才能编辑组员！");
                return;
            }

            List<Models.Student> Removed_stu = new List<Models.Student>();
            Models.Student stu;

            foreach (DataGridViewRow dr in Group_members.SelectedRows) // 遍历在“组成员”DataGridView控件中选中的所有行
            {
                stu = group_members[dr.Index]; // 获取当前行对应的学生对象。
                if (stu.stu_id == log_info.student.stu_id) // 如果当前学生是操作的学生本人，则停止循环（不允许移除自己）。
                { break; }
                Removed_stu.Add(stu);
            }
            try
            {
                if (!bllGroup.Remove_student(Removed_stu, stu_Group))// 调用业务逻辑层的bllGroup.Remove_student方法，尝试将Removed_stu列表中的学生从stu_Group分组中移除。如果移除失败，则显示消息框提示，并退出方法。
                {
                    MessageBox.Show("删除失败！");
                    return;
                }
                group_members = b_Student.GetList(stu_Group);
                Group_members.DataSource = group_members;
                all_stu_wo_group = b_Student.GetList_wo_Group();
                Student_list.DataSource = all_stu_wo_group;
            }
            catch (Tools.Del_Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        private void uiButton_release2_Click(object sender, EventArgs e)
        {
            if (log_info.Student_timeout)
            {
                MessageBox.Show("已经超时，不能再修改！");
                return;
            }

            if (string.IsNullOrEmpty(Group_name.Text))
            {
                MessageBox.Show("操作之前请队长先输入队伍信息，提交队伍进行建队！");
                return;
            }


            if (log_info.student.is_gleader == -1)
            {
                MessageBox.Show("组长才能解散队伍！");
                return;
            }

            //b_Student.ResetOtherStudentsLeadership2(stu_Group.group_id, Models.log_info.student.stu_id);


            try
            {
                BLL.B_Group b_Group = new BLL.B_Group();
                b_Group.release(stu_Group);


                clear_control();
                Group_members.DataSource = null;
                all_stu_wo_group = b_Student.GetList_wo_Group();
                Student_list.DataSource = all_stu_wo_group;
            }
            catch (Tools.Modify_Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        private void uiTextBox2_TextChanged(object sender, EventArgs e)
        {

        }

        private void sTreturn1_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
